package com.gaussdb.tool;

import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.ArrayList;



public class DataSqlUtil {
    /**
     * 向指定表中插入数据
     *
     * @param conn        数据库连接对象，用于执行SQL语句
     * @param tableName   要插入数据的表名
     * @param columnsType 包含各列数据类型的数组
     * @param columnsVal  包含各列数据值的数组
     * @throws SQLException 如果执行SQL过程中发生错误
     */
    public static void insertData(Connection conn, String tableName, String opType, String[] columnsType, String[] columnsVal) throws SQLException, ParseException {
        // 根据表变动sql预编译
        // 拼接 ?,?,?,? ,追究列数
        ArrayList<String> sql_str = new ArrayList<>();
        for (int i = 0; i <= columnsVal.length; i++) {
            sql_str.add("?");
        }
        String sql_join = String.join(",", sql_str);
        PreparedStatement preparedStatement = conn.prepareStatement("insert into " + tableName + " values(" + sql_join + ")");

        // 遍历每列数据，根据其类型设置到PreparedStatement中
        for (int i = 0; i < columnsType.length; i++) {
//            System.out.println(i + ":" + columnsType[i]);
            // 处理整数类型
            if (columnsType[i].equals("integer") || columnsType[i].equals("tinyint") || columnsType[i].equals("smallint") || columnsType[i].equals("bigint")) {
                Integer col1 = Integer.valueOf(columnsVal[i]);
                preparedStatement.setInt(i + 1, col1);
            }
            // 处理数值类型
            else if (columnsType[i].equals("number") || columnsType[i].equals("numeric")) {
                BigDecimal col2 = new BigDecimal(columnsVal[i]);
                preparedStatement.setBigDecimal(i + 1, col2);
            }
            // 处理浮点数类型
            else if (columnsType[i].equals("real") || columnsType[i].equals("double precision")) {
                Double col3 = Double.valueOf(columnsVal[i]);
                preparedStatement.setDouble(i + 1, col3);
            }
            // 处理字符串类型
            else if (columnsType[i].equals("character") || columnsType[i].equals("character varying") || columnsType[i].equals("nvarchar2")) {
                String col4 = columnsVal[i];
                preparedStatement.setString(i + 1, col4);
            }
            // 处理布尔类型
            else if (columnsType[i].equals("bit")) {
                String col5 = columnsVal[i];
                preparedStatement.setString(i + 1, col5);
            }
            // 处理变长位串类型
            else if (columnsType[i].equals("bit varying")) {
                // bit varying 类型在Java中没有直接对应的类型，可以考虑使用String或byte[]
                String col6 = columnsVal[i];
                preparedStatement.setString(i + 1, col6);
            }
            // 处理大文本类型
            else if (columnsType[i].equals("clob") || columnsType[i].equals("text")) {
                String col7 = columnsVal[i];
                preparedStatement.setString(i + 1, col7);
            }
            // 处理布尔类型
            else if (columnsType[i].equals("boolean")) {
                Boolean col8 = Boolean.valueOf(columnsVal[i]);
                preparedStatement.setBoolean(i + 1, col8);
            }
            // 处理日期类型
            else if (columnsType[i].equals("date") || columnsType[i].equals("timestamp without time zone") || columnsType[i].equals("datetime")) {
                // doris 不支持date类型，doris支持datetime类型
                Timestamp col9 = Timestamp.valueOf(columnsVal[i].replaceAll("'", ""));
                preparedStatement.setTimestamp(i + 1, col9);
            }
            // 处理小日期时间类型
            else if (columnsType[i].equals("smalldatetime")) {
                // smalldatetime 类型在Java中没有直接对应的类型，可以考虑使用datetime
                Timestamp col10 = Timestamp.valueOf(columnsVal[i].replaceAll("'", ""));
                preparedStatement.setTimestamp(i + 1, col10);
            }
            // 处理货币类型
            else if (columnsType[i].equals("money")) {
                String col11 = columnsVal[i];
                preparedStatement.setString(i + 1, col11);
            }
        }

        // 最后一列操作类型
        try {
            preparedStatement.setString(columnsType.length + 1, opType);
        } catch (Exception e) {
            System.out.println("请在目标数据库中表增加一个操作字段，名称为op_type_column");
        }

        // 执行sql
        preparedStatement.execute();
    }

    public static void updateData(Connection conn, String tableName, String opType, String[] columnsType, String[] columnsVal) throws SQLException {
        String sql_str = "update " + tableName + " set op_type_column ='" + opType + "' where id =  " + columnsVal[0];
        // 修改操作类型字段
        PreparedStatement preparedStatement = conn.prepareStatement(sql_str);

        // 执行sql
        preparedStatement.execute();
    }

    public static void deleteData(Connection conn, String tableName, String opType, String[] columnsType, String[] columnsVal) throws SQLException {
        // delete操作
        PreparedStatement preparedStatement = conn.prepareStatement("delete from " + tableName + " where id = " + columnsVal[0]);

        // 执行sql
        preparedStatement.execute();
    }

}